﻿.syntax unified
.arch armv7-m

#define __STARTUP_CLEAR_BSS


#define __STACK_SIZE 0x400
/* stack 段 */
.section .stack
.align 3
#ifdef __STACK_SIZE
  .equ STACK_SIZE, __STACK_SIZE
#else
  .equ STACK_SIZE, 0x400
#endif
.globl __STACK_TOP
.globl __STACK_LIMIT
__STACK_LIMIT:
  .space STACK_SIZE
  .size __STACK_LIMIT, .-__STACK_LIMIT
__STACK_TOP:
  .size __STACK_TOP, .-__STACK_TOP

/* heap 段 */
.section .heap
.align 3
#ifdef __HEAP_SIZE
  .equ HEAP_SIZE, __HEAP_SIZE
#else
  .equ HEAP_SIZE, 0
#endif
.globl __HEAP_BASE
.globl __HEAP_LIMIT
__HEAP_BASE:
  .if HEAP_SIZE
  .space HEAP_SIZE
  .endif
  .size __HEAP_BASE, .-__HEAP_BASE
__HEAP_LIMIT:
  .size __HEAP_LIMIT, .-__HEAP_LIMIT


.section .isr_vector
.align 2
.globl __isr_vector
__isr_vector:
    .long    __STACK_TOP            /* Top of Stack */
    .long    reset_handler         /* Reset Handler */
    .long    NMI_Handler           /* NMI Handler */
    .long    HardFault_Handler     /* Hard Fault Handler */
    .long    MemManage_Handler     /* MPU Fault Handler */
    .long    BusFault_Handler      /* Bus Fault Handler */
    .long    UsageFault_Handler    /* Usage Fault Handler */
    .long    0                     /* Reserved */
    .long    0                     /* Reserved */
    .long    0                     /* Reserved */
    .long    0                     /* Reserved */
    .long    SVC_Handler           /* SVCall Handler */
    .long    DebugMon_Handler      /* Debug Monitor Handler */
    .long    0                     /* Reserved */
    .long    PendSV_Handler        /* PendSV Handler */
    .long    SysTick_Handler       /* SysTick Handler */

    /* External interrupts */
    .long    WWDG_IRQHandler                   /* Window WatchDog                                  */
    .long    PVD_IRQHandler                    /* PVD through EXTI Line detection                  */
    .long    TAMP_STAMP_IRQHandler             /* Tamper and TimeStamps through the EXTI line      */
    .long    RTC_WKUP_IRQHandler               /* RTC Wakeup through the EXTI line                 */
    .long    FLASH_IRQHandler                  /* FLASH                                            */
    .long    RCC_IRQHandler                    /* RCC                                              */
    .long    EXTI0_IRQHandler                  /* EXTI Line0                                       */
    .long    EXTI1_IRQHandler                  /* EXTI Line1                                       */
    .long    EXTI2_IRQHandler                  /* EXTI Line2                                       */
    .long    EXTI3_IRQHandler                  /* EXTI Line3                                       */
    .long    EXTI4_IRQHandler                  /* EXTI Line4                                       */
    .long    DMA1_Stream0_IRQHandler           /* DMA1 Stream 0                                    */
    .long    DMA1_Stream1_IRQHandler           /* DMA1 Stream 1                                    */
    .long    DMA1_Stream2_IRQHandler           /* DMA1 Stream 2                                    */
    .long    DMA1_Stream3_IRQHandler           /* DMA1 Stream 3                                    */
    .long    DMA1_Stream4_IRQHandler           /* DMA1 Stream 4                                    */
    .long    DMA1_Stream5_IRQHandler           /* DMA1 Stream 5                                    */
    .long    DMA1_Stream6_IRQHandler           /* DMA1 Stream 6                                    */
    .long    ADC_IRQHandler                    /* ADC1, ADC2 and ADC3s                             */
    .long    CAN1_TX_IRQHandler                /* CAN1 TX                                          */
    .long    CAN1_RX0_IRQHandler               /* CAN1 RX0                                         */
    .long    CAN1_RX1_IRQHandler               /* CAN1 RX1                                         */
    .long    CAN1_SCE_IRQHandler               /* CAN1 SCE                                         */
    .long    EXTI9_5_IRQHandler                /* External Line[9:5]s                              */
    .long    TIM1_BRK_TIM9_IRQHandler          /* TIM1 Break and TIM9                              */
    .long    TIM1_UP_TIM10_IRQHandler          /* TIM1 Update and TIM10                            */
    .long    TIM1_TRG_COM_TIM11_IRQHandler     /* TIM1 Trigger and Commutation and TIM11           */
    .long    TIM1_CC_IRQHandler                /* TIM1 Capture Compare                             */
    .long    TIM2_IRQHandler                   /* TIM2                                             */
    .long    TIM3_IRQHandler                   /* TIM3                                             */
    .long    TIM4_IRQHandler                   /* TIM4                                             */
    .long    I2C1_EV_IRQHandler                /* I2C1 Event                                       */
    .long    I2C1_ER_IRQHandler                /* I2C1 Error                                       */
    .long    I2C2_EV_IRQHandler                /* I2C2 Event                                       */
    .long    I2C2_ER_IRQHandler                /* I2C2 Error                                       */
    .long    SPI1_IRQHandler                   /* SPI1                                             */
    .long    SPI2_IRQHandler                   /* SPI2                                             */
    .long    USART1_IRQHandler                 /* USART1                                           */


    .size    __isr_vector, . - __isr_vector

.text 
.thumb
.thumb_func
.align 2
.globl reset_handler
.type reset_handler, %function
reset_handler:
  ldr r1, = data_load_addr
  ldr r2, =__data_start
  ldr r3, =__data_end
#if 1
.LC0:
  cmp r2, r3
  ittt lt
  ldrlt r0, [r1], #4
  strlt r0, [r2], #4
  blt .LC0
#else
.LC0:
  subs r3, r2
  ble .LC1
.LC1:
#endif

#ifdef __STARTUP_CLEAR_BSS
  ldr r1, =__bss_start__
  //ldr r1, =0
  ldr r2, =__bss_end__
  //ldr r2, = 0
  movs r0, 0
.LC2:
  cmp     r1, r2
  itt    lt
  strlt   r0, [r1], #4
  blt    .LC2
#endif   /* __STARTUP_CLEAR_BSS */

#ifndef __NO_SYSTEM_INIT
  bl SystemInit
  b main
#endif

.macro    def_default_handler    handler_name
.align 1
.thumb_func
.weak    \handler_name
.type    \handler_name, %function
\handler_name :
b    .
.size    \handler_name, . - \handler_name
.endm
def_default_handler    NMI_Handler
def_default_handler    HardFault_Handler
def_default_handler    MemManage_Handler
def_default_handler    BusFault_Handler
def_default_handler    UsageFault_Handler
def_default_handler    SVC_Handler
def_default_handler    DebugMon_Handler
def_default_handler    PendSV_Handler
def_default_handler    SysTick_Handler
def_default_handler    Default_Handler
def_default_handler    WWDG_IRQHandler
def_default_handler    PVD_IRQHandler
def_default_handler    TAMP_STAMP_IRQHandler
def_default_handler    RTC_WKUP_IRQHandler
def_default_handler    FLASH_IRQHandler
def_default_handler    RCC_IRQHandler
def_default_handler    EXTI0_IRQHandler
def_default_handler    EXTI1_IRQHandler
def_default_handler    EXTI2_IRQHandler
def_default_handler    EXTI3_IRQHandler
def_default_handler    EXTI4_IRQHandler
def_default_handler    DMA1_Stream0_IRQHandler
def_default_handler    DMA1_Stream1_IRQHandler
def_default_handler    DMA1_Stream2_IRQHandler
def_default_handler    DMA1_Stream3_IRQHandler
def_default_handler    DMA1_Stream4_IRQHandler
def_default_handler    DMA1_Stream5_IRQHandler
def_default_handler    DMA1_Stream6_IRQHandler
def_default_handler    ADC_IRQHandler
def_default_handler    CAN1_TX_IRQHandler
def_default_handler    CAN1_RX0_IRQHandler
def_default_handler    CAN1_RX1_IRQHandler
def_default_handler    CAN1_SCE_IRQHandler
def_default_handler    EXTI9_5_IRQHandler
def_default_handler    TIM1_BRK_TIM9_IRQHandler
def_default_handler    TIM1_UP_TIM10_IRQHandler
def_default_handler    TIM1_TRG_COM_TIM11_IRQHandler
def_default_handler    TIM1_CC_IRQHandler
def_default_handler    TIM2_IRQHandler
def_default_handler    TIM3_IRQHandler
def_default_handler    TIM4_IRQHandler
def_default_handler    I2C1_EV_IRQHandler
def_default_handler    I2C1_ER_IRQHandler
def_default_handler    I2C2_EV_IRQHandler
def_default_handler    I2C2_ER_IRQHandler
def_default_handler    SPI1_IRQHandler
def_default_handler    SPI2_IRQHandler
def_default_handler    USART1_IRQHandler

    .end
